<?php
/*
 * @Descripttion: 队列任务消费者脚本
 * @version: 
 * @Author: ewgof
 * @Date: 2021-04-27 14:16:16
 * @LastEditors: ewgof
 * @LastEditTime: 2022-12-03 22:16:10
 */

// require_once './Driver.php';
// require_once './Test.php';
// use queue\drivers\RedisDriver;
// use queue\Test;

require __DIR__ . '/functions.php';
global $config_queue;
// 获取默认队列驱动
$driver = getQueueDriver();

$msg = '消费者任务脚本开始执行 ... ';
echo $msg . PHP_EOL;
logw($msg, 'info');

while (true) {
    $msg = '连接队列服务提供者 ... ';
    echo $msg . PHP_EOL;
    logw($msg, 'info');

    $driver::connect();
    $queue_msg_arr = $driver::pull($config_queue['queue_name']);
    if (empty($queue_msg_arr)) {
        $msg = '未从队列服务提供者拉取到消息 ... ';
        echo $msg . PHP_EOL;
        logw($msg, 'info');
        continue;
    }

    $msg = '从队列服务提供者拉取到一条消息， msg => ' . var_export($queue_msg_arr, true);
    echo $msg . PHP_EOL;
    logw($msg, 'info');

    $handler = $queue_msg_arr['handler'];
    // var_dump($handler); exit;

    if (empty($handler[0]) || empty($handler[1])) {
        $msg = '类名或者方法名为空, handler => ' . var_export($handler, true);
        echo $msg . PHP_EOL;
        logw($msg, 'error');
        continue;
    }

    // 不知道为什么，这里必须先取出来而不能直接使用
    $class = $handler[0];
    $method = $handler[1];
    if (!class_exists($class)) {
        $msg = '类[' . $class . ']不存在';
        echo $msg . PHP_EOL;
        logw($msg, 'error');
        continue;
    }
    if (!method_exists($class, $method)) {
        $msg = '方法[' . $method . ']不存在';
        echo $msg . PHP_EOL;
        logw($msg, 'error');
        continue;
    }

    $msg = '处理任务 ... ';
    echo $msg . PHP_EOL;
    logw($msg, 'info');

    $rf = new ReflectionMethod($class, $method);
    if ($rf->isStatic()) {
        // 静态调用
        $rst = $class::$method($queue_msg_arr['params']);
    } else {
        // 非静态调用
        $obj = new $class($queue_msg_arr['init_params']);
        $rst = $obj->$method($queue_msg_arr['params']);
    }

    $result = 'success';
    if (false === $rst) {
        $result = 'failed';
    }

    // 消息处理确认
    $driver::confirm($queue_msg_arr, $result);

    $msg = '处理完成一个任务 ... ';
    echo $msg . PHP_EOL;
    logw($msg, 'info');

    sleep(0.5);
}
